<?php
namespace backend\modules\admin\controllers;

use Yii;
use yii\helpers\Url;
use yii\data\ActiveDataProvider;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use backend\modules\admin\models\Menu;
use common\models\Tree;
use backend\modules\admin\models\RolePriv;
use backend\modules\admin\models\Site;
use yii\web\Response;
class MenuController extends Controller
{
    /**
     * 菜单列表
     * @return string
     */
    public function actionIndex()
    {
         //排序
        if(!empty($_POST['submit'])) //判断是否有提交过来的数据
        {
            $listorder=Yii::$app->request->post('listorder'); //获取提交过来的数据
            if(!empty($listorder))
            {
                foreach($listorder as $key=>$value)
                {
                    $model=Menu::findOne($key);//根据遍历出来的$key在menu表中查出对应数据
                    $model->listorder=intval($value); //将value值赋给listorder，获取其整数值
                    if($model->validate())
                    {
                        $model->save();//将数据保存到数据库中
                    }
                    else
                    {
                        echo '菜单"'.$model->cname.'"信息保存有误';//信息保存有误
                    }
                }
            }
        }
        //将menu和tree进行实例化
        $menu = new Menu();
        $tree = new Tree();
        $tree->icon = array('│ ','├─ ','└─ ');//图标
        $tree->nbsp = '&nbsp;&nbsp;&nbsp;';//空格
        $menu_all = Menu::find()->where(['status'=>0])->orderBy('listorder ASC,id ASC')->asArray()->all();//得到menu表中的所有数据，以listorder进行升序排序，id降序排列

        foreach($menu_all as $key=>$cat)
        {
            $menu_all[$key]['parentid_node']=$cat['parentid']?' class="child-of-node-'.$cat['parentid'].'"':'';//如果 $cat['parentid']不为空就赋值如果为空就赋值空
            $menu_all[$key]['level']=Menu::get_level($cat['id'],$menu_all);//对数据进行分等级
        }
        //生成树形结构
        $str  = "<tr id='node-\$id' \$parentid_node>
            <td style='width:10px;'><input type='text' name='listorder[\$id]' style='width:50px;'class='text-center' value='\$listorder' ></td>
            <td>\$id</td>
            <td>\$spacer \$cname</td>
            <td>\$m</td>
            <td>\$c</td>
            <td>\$a</td>
            <td>
                <a href=".Url::toRoute(['menu/addmenu'])."?id=\$id&&parentid=\$id>
                    <button type='button' class='btn btn-primary'>添加</button>
                </a>
                <a href=".Url::toRoute(['menu/updatemenu'])."?id=\$id&&parentid=\$parentid>
                    <button type='button' class='btn btn-success'>编辑</button>
                </a>
                <a href=".Url::toRoute(['menu/deletemenu'])."?id=\$id onclick='del(\$id)'>
                <button type='button' class='btn btn-danger'>删除</button>
                </a>
            </td>
        </tr>";
        $tree->init($menu_all);//对数据进行初始化
        $categorys = $tree->get_tree(0, $str);//调用tree模型中的get_tree方法
        return $this->render('index',[//将数据传到index页面中
            'categorys'=>$categorys,
        ]);
    }
    //菜单添加
    public function actionAddmenu($id=0,$parentid=0)//从url中得到传过来的id和partentid，若没有传值，则默认为0
    {
        $model = new Menu();//初始化menu
        $tree = new Tree();//初始化tree
        $menu_all = Menu::find()->where(['status'=>0])->asArray()->all();//得到menu中的所有数据
        $menu_one = Menu::findOne(['id' => $id]); //得到menu表中传值过来的id的这一条数据
        $rs = [
            'url'=>'index',//跳转页面，若为goback,则返回上一页
            'msg'=>'添加失败',//跳转自定义信息
            'ms'=>5000,//延迟时间
            'msg_type'=>'error'//消息类型，success,error,close
        ];
        if($model->load(Yii::$app->request->post()))//如果页面传过来的数据成功加载并保存到数据库中，则跳转到列表页
        {
            
            if($model->validate())
            {
                $model->save(); 
                return $this->render('//msg',
                [
                    'url'=>'index',//跳转页面，若为goback,则返回上一页
                    'msg'=>'添加成功',//跳转自定义信息
                    'ms'=>5000,//延迟时间
                    'msg_type'=>'success'//消息类型，success,error,close
                ]);
            }
            else
            {
                return $this->render('//msg',$rs);
            }
        }
        else
        {
            if($parentid==0)//当parentid的值为0时，跳转到添加菜单的页面，若不是则跳转到添加子菜单的页面
            {
                $str  = "<option value=\$id>\$spacer\$cname</option>";//生成树形结构的基本代码
                $tree->init($menu_all); 
                $menu= $tree->get_tree(0, $str);//得到树形结构
                return $this->render('addmenu', [
                    'model' => $model,
                    'menu_all'=>$menu_all,
                    'menu'=>$menu,
                ]); 
            }
            else
            {
                $str1  = "<option value='\$id' \$selected>\$spacer\$cname</option>";//生成树形结构的基本代码，并且默认选中其上级菜单
                $tree->init($menu_all); 
                $menustr= $tree->get_tree(0, $str1,$parentid);
                return $this->render('submenu', [
                    'model' => $model,
                    'menu_one'=>$menu_one,
                    'menustr'=>$menustr,
                ]);
            }

        }

    }
    //菜单更新
    public function actionUpdatemenu($id,$parentid)
    {
        $tree = new Tree(); 
        $model = Menu::findOne([//在menu表中查出当前id的这一条数据
            'id' => $id,
        ]);
        $menu = Menu::find()->where(['status'=>0])->asArray()->all(); //查询出menu表中的所有数据
        $str  = "<option value='\$id'\$selected>\$spacer\$cname</option>";//生成树形结构
        $tree->init($menu);//对数据进行初始化
        $submenu= $tree->get_tree(0, $str,$model->parentid);
        $rs = [
            'url'=>'index',//跳转页面，若为goback,则返回上一页
            'msg'=>'修改失败',//跳转自定义信息
            'ms'=>5000,//延迟时间
            'msg_type'=>'error'//消息类型，success,error,close
        ];   
        if($model->load(Yii::$app->request->post()))
        {
            if($model->validate())
            {
                $model->save(); 
                return $this->render('//msg',
                [
                    'url'=>'index',//跳转页面，若为goback,则返回上一页
                    'msg'=>'修改成功',//跳转自定义信息
                    'ms'=>5000,//延迟时间
                    'msg_type'=>'success'//消息类型，success,error,close
                ]);
            }
            else
            {
                return $this->render('//msg',$rs);
            }
        }
        else
        {
            return $this->render('updatemenu',[
                'model' => $model,
                'menu'=>$menu,
                'submenu'=>$submenu,
            ]);
        }
    } 
   //菜单删除
   public function actionDeletemenu($id)
   {
       Yii::$app->response->format=Response::FORMAT_JSON;
       $menu=Menu::findone(['id'=>$id]);
       $menu->status = -1;//更改状态
       $res=$menu->save();//保存
       if($menu->parentid!=0)//判断如果parentid不等于0
       {
           $parent = Menu::findOne(['id'=>$menu->parentid]);//查询出当前栏目的父栏目
           $ids = $parent->arrchildid;//获取属性值
           $idsarray =  explode(',',$ids);//分割成数组
           if(in_array($id,$idsarray))//判断如果删除栏目id在父栏目arrchildid字段中
           {
               foreach($idsarray as $key=>$value)//循环遍历出arrchildid字段中的值
               {
                   if($value==$menu->id)//如果值与删除栏目catid相等
                   {
                       unset($idsarray[$key]);//释放
                   }
               }
               $arrchildid = implode(',',$idsarray);//拼接释放后的剩下的值
               $parent->arrchildid=$arrchildid;//赋值
               $parent->save();//保存
           }
       }
       if($res)
       {
           return ['msg'=>'删除成功','status'=>-1];
       }
       else
       {
           return ['msg'=>'删除失败','status'=>0];
       }
   }               
       
}
